#pragma once

#include <cstdint>
#include <iostream>
#include <optional>
#include <stdexcept>


// #include "TxnnCpp/Common.h" // for ERROR_MSG
/**
 * @brief 生成错误消息的宏。
 *
 * 此宏用于生成包含文件名、行号和函数名的错误消息，方便定位错误位置。
 *
 * @param msg 错误描述信息。
 */
#define ERROR_MSG(msg) (std::string("Error in ") + __FILE__ + ":" + std::to_string(__LINE__) + " (" + __FUNCTION__ + "): " + msg)

namespace image {
/**
 * @brief 图像结构体，用于存储图像数据及其尺寸信息
 */
struct Image {
  void* data; ///< 图像数据指针
  int width = 0;  ///< 图像宽度
  int height = 0; ///< 图像高度

  Image() {} // 默认构造函数

  Image(void* data, int width, int height) : data(data), width(width), height(height) {
    if (width <= 0 || height <= 0) {
      throw std::invalid_argument(ERROR_MSG("Image width and height must be positive"));
    }
  }

  friend std::ostream& operator<<(std::ostream& os, const Image& image) {
    os << "Image(width=" << image.width << ", height=" << image.height << ", data=" << image.data << ")";
    return os;
  }
};

} // namespace image